package com.xs.designpattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 这是一个抽象类，作为组合模式中的组件，定义了组合对象的公共行为。
 * 持有一个 children 列表，用于保存子节点。
 * @author xs
 */
public abstract class LetterComposite {
    private final List<LetterComposite> children = new ArrayList<>();

    /**
     * 用于添加子节点
     * @param letter 字符
     */
    public void add(LetterComposite letter) {
        children.add(letter);
    }

    /**
     * 返回子节点数量。
     * @return list大小
     */
    public int count() {
        return children.size();
    }

    /**
     * 定义组合对象的打印前行为
     */
    protected void printThisBefore() {
    }

    /**
     * 定义组合对象的打印后行为
     */
    protected void printThisAfter() {
    }

    /**
     * 递归地打印组合对象的内容
     */
    public void print() {
        printThisBefore();
        children.forEach(LetterComposite::print);
        printThisAfter();
    }
}
